from typing import Dict, Optional
from app.db.crud import get_db
from sqlalchemy.orm import Session
from fastapi import APIRouter, Depends
from app.common.security import check_jwt_token
from app.api.schemas.company import Company_Schema
from app.common.response_code import resp_200, resp_202
from app.db.crud.company_crud import get_company_by_creditcode, create_companyinfo, update_companyinfo, delete_companyinfo

# 实例化API路由，需注册到主路由上去
companyAdminAPI = APIRouter(dependencies=[Depends(check_jwt_token)])

@companyAdminAPI.post("/add_company", summary="新增公司信息接口")
def add_company(company: Company_Schema, db: Session = Depends(get_db)):
    """
    新增公司的API接口
    
    :param company: 包含公司信息的Company_Schema对象
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 添加成功的响应或公司已存在的错误响应
    """
    # 检查公司是否已存在
    if get_company_by_creditcode(db, company.creditcode):
        # 如果公司信息已存在，返回406错误响应
        return resp_202(company.creditcode, message="公司已存在")
    else:
        # 如果公司信息不存在，调用register_user函数注册新用户，并返回200成功响应
        return resp_200(create_companyinfo(db, company), message="公司新增成功")
    
@companyAdminAPI.post("/get_company", summary="获取公司信息接口")
def get_company(creditcode: Optional[Dict] = None, db: Session = Depends(get_db)):
    """
    根据公司信用代码获取公司信息的API接口

    :param company_creditcode: 公司信用代码
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 公司信息的响应或公司不存在的错误响应
    """
    # 检查是否提供了公司信用代码
    if creditcode:
        # 调用get_company_by_creditcode函数获取公司信息，并返回对应公司信息和200成功响应
        return resp_200(get_company_by_creditcode(db, creditcode["creditcode"]), message="获取公司信息成功")
    else:
        # 如果没有提供公司信用代码，则返回所有公司信息和200成功响应
        return resp_200(get_company_by_creditcode(db, None), message="获取所有公司信息成功")
    
    
@companyAdminAPI.post("/update_company", summary="更新公司信息接口")
def update_company(company: Company_Schema, db: Session = Depends(get_db)):
    """
    更新公司信息的API接口

    :param company: 包含公司信息的Company_Schema对象
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 更新成功的响应或公司不存在的错误响应
    """
    if company is None:
        # 如果公司信息为空，返回406错误响应
        return resp_202(company, message="待更新公司信息不能为空")
    
    if not get_company_by_creditcode(db, company.creditcode):
        # 如果公司信息不存在，返回406错误响应)
        return resp_202(company, message="公司信息不存在")
    else:
        # 如果公司信息存在，调用update_company函数更新公司信息，并返回200成功响应
        return resp_200(update_companyinfo(db, company), message="公司信息更新成功")
    
@companyAdminAPI.post("/delete_company", summary="删除公司信息接口")
def delete_company(creditcode: Dict, db: Session = Depends(get_db)):
    """
    删除公司信息的API接口

    :param company: 包含公司信息的Company_Schema对象
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 删除成功的响应或公司不存在的错误响应
    """
    # 检查待删除公司的信用代码是否为空
    if creditcode is None:
        # 如果为空，返回406错误响应
        return resp_202(creditcode, message="待删除公司信用代码不能为空")
    
    # 检查公司是否存在
    if not get_company_by_creditcode(db, creditcode["creditcode"]):
        # 如果公司信息不存在，返回406错误响应
        return resp_202(creditcode, message="公司信息不存在")
    else:
        # 如果公司信息存在，调用delete_companyinfo函数删除公司信息，并返回200成功响应
        return resp_200(delete_companyinfo(db, creditcode["creditcode"]), message="公司信息删除成功")